home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / Peter Lewis (TCPExample) / PNL Libraries / MyStrings.p < prev    next >
Encoding:
Text File  |  1995-12-01  |  11.6 KB  |  505 lines  |  [TEXT/CWIE]

  1. unit MyStrings;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Types, MyTypes;
  7.  
  8.     procedure LeftP (var s: Str255; len: integer);
  9.     function Left (var s: Str255; len: integer): Str255;
  10.     procedure LeftAssignP (var s: Str255; len: integer; var rhs: Str255);
  11.     function LeftAssign (var s: Str255; len: integer; var rhs: Str255): Str255;
  12.     procedure RightP (var s: Str255; len: integer);
  13.     function Right (var s: Str255; len: integer): Str255;
  14.     procedure RightAssignP (var s: Str255; len: integer; var rhs: Str255);
  15.     function RightAssign (var s: Str255; len: integer; var rhs: Str255): Str255;
  16.     procedure MidP (var s: Str255; p, len: integer);
  17.     function Mid (var s: Str255; p, len: integer): Str255;
  18.     procedure MidAssignP (var s: Str255; p, len: integer; var rhs: Str255);
  19.     function MidAssign (var s: Str255; p, len: integer; var rhs: Str255): Str255;
  20.     procedure HandleToString (hhhh: univ handle; var s: Str255);
  21.     function HandleToStr (hhhh: univ handle): Str255;
  22.     procedure StringToHandle (var s: Str255; hhhh: univ handle);
  23.     function Trim (s: string): string;
  24.     function UpCase (ch: char): char;
  25. {$IFC not GENERATINGPOWERPC}
  26.     inline
  27.         $301F, $0C00, $0061, $6500, $000E, $0C00, $007B, $6400, $0006, $0400, $0020, $3E80;
  28. {$ENDC}
  29.     function IsDigit(ch:char):boolean;
  30. {$IFC not GENERATINGPOWERPC}
  31.     inline
  32.         $321F,$0C41,$0030,$5CC0,$6D08,$0C41,$0039,$6F02,$5FC0,$4400,$1E80;
  33. {$ENDC}
  34.     function IsLower(ch:char):boolean;
  35. {$IFC not GENERATINGPOWERPC}
  36.     inline
  37.         $321F,$0C41,$0061,$5CC0,$6D08,$0C41,$007A,$6F02,$5FC0,$4400,$1E80;
  38. {$ENDC}
  39.     function IsUpper(ch:char):boolean;
  40. {$IFC not GENERATINGPOWERPC}
  41.     inline
  42.         $321F,$0C41,$0041,$5CC0,$6D08,$0C41,$005A,$6F02,$5FC0,$4400,$1E80;
  43. {$ENDC}
  44.     function IsAlpha(ch:char):boolean;
  45. {$IFC not GENERATINGPOWERPC}
  46.     inline
  47.         $321F,$0C41,$0041,$5CC0,$6D16,$0C41,$005A,$6F10,$0C41,$0061,$5CC0,$6D08,$0C41,$007A,$6F02,$5FC0,$4400,$1E80;
  48. {$ENDC}
  49.  
  50.     procedure UpCaseString (var s: string);
  51.     function UpCaseStr (s: string): string;
  52. {    procedure SPrintS5V (var dst: Str255;var  src,s1, s2, s3, s4, s5: Str255);}
  53.     procedure SPrintS5 (var dst: Str255; src, s1, s2, s3, s4, s5: Str255);
  54.     procedure SPrintS3 (var dst: Str255; src, s1, s2, s3: Str255);
  55.     function PosRight (sub, s: Str255): integer;
  56.     procedure SplitRightBy (s: Str255; ch: char; var left, right: Str255);
  57.     procedure SplitBy (s: Str255; ch: char; var left, right: Str255);
  58.     function Split (sub, s: Str255; var s1, s2: Str255): boolean;
  59.     function SplitRight (sub, s: Str255; var s1, s2: Str255): boolean;
  60.     function TPpos (sub, str: string): integer;
  61.     function TPcopy (source: string; start, count: integer): string;
  62.     procedure TPCopyString(var source,dest: string; destlen:integer);
  63.     function Match (pattern, name: Str255): boolean;
  64.     procedure LimitStringLength (var s: string; len: integer; delimiter: char);
  65.     function StringToOSType (s: Str255): OSType;
  66.     function OSTypeToString (t: OSType): Str255;
  67.     function FindCharacter(p:Ptr; len:longint; ch:Char; var pos:longint):boolean;
  68.  
  69. implementation
  70.  
  71.     uses
  72.         Memory, OSUtils, TextUtils, MyMathUtils, QLowLevel;
  73.  
  74.     function FindCharacter(p:Ptr; len:longint; ch:Char; var pos:longint):boolean;
  75.     begin
  76.         pos:=0;
  77.         while (pos<len) & (AddPtrLong(p,pos)^<>ord(ch)) do begin
  78.             pos:=pos+1;
  79.         end;
  80.         FindCharacter:= pos<len;
  81.     end;
  82.     
  83.     procedure LeftP (var s: Str255; len: integer);
  84.     begin
  85.         s := TPcopy(s, 1, len);
  86.     end;
  87.  
  88.     function Left (var s: Str255; len: integer): Str255;
  89.     begin
  90.         Left := TPcopy(s, 1, len);
  91.     end;
  92.  
  93.     procedure LeftAssignP (var s: Str255; len: integer; var rhs: Str255);
  94.     begin
  95.         s := concat(rhs, TPcopy(s, len + 1, 255));
  96.     end;
  97.  
  98.     function LeftAssign (var s: Str255; len: integer; var rhs: Str255): Str255;
  99.     begin
  100.         LeftAssign := concat(rhs, TPcopy(s, len + 1, 255));
  101.     end;
  102.  
  103.     procedure RightP (var s: Str255; len: integer);
  104.         var
  105.             p: integer;
  106.     begin
  107.         p := Length(s) - len;
  108.         if p < 1 then begin
  109.             p := 1;
  110.         end;
  111.         s := TPcopy(s, p, 255);
  112.     end;
  113.  
  114.     function Right (var s: Str255; len: integer): Str255;
  115.         var
  116.             p: integer;
  117.     begin
  118.         p := Length(s) - len;
  119.         if p < 1 then begin
  120.             p := 1;
  121.         end;
  122.         Right := TPcopy(s, p, 255);
  123.     end;
  124.  
  125.     procedure RightAssignP (var s: Str255; len: integer; var rhs: Str255);
  126.     begin
  127.         s := concat(TPcopy(s, 1, Length(s) - len), rhs);
  128.     end;
  129.  
  130.     function RightAssign (var s: Str255; len: integer; var rhs: Str255): Str255;
  131.     begin
  132.         RightAssign := concat(TPcopy(s, 1, Length(s) - len), rhs);
  133.     end;
  134.  
  135.     procedure MidP (var s: Str255; p, len: integer);
  136.     begin
  137.         s := TPcopy(s, p, len);
  138.     end;
  139.  
  140.     function Mid (var s: Str255; p, len: integer): Str255;
  141.     begin
  142.         Mid := TPcopy(s, p, len);
  143.     end;
  144.  
  145.     procedure MidAssignP (var s: Str255; p, len: integer; var rhs: Str255);
  146.     begin
  147.         s := concat(TPcopy(s, 1, p - 1), rhs, TPcopy(s, p + len + 1, 255));
  148.     end;
  149.  
  150.     function MidAssign (var s: Str255; p, len: integer; var rhs: Str255): Str255;
  151.     begin
  152.         MidAssign := concat(TPcopy(s, 1, p - 1), rhs, TPcopy(s, p + len + 1, 255));
  153.     end;
  154.  
  155. {$PUSH}
  156. {$R-}
  157.     procedure HandleToString (hhhh: univ handle; var s: Str255);
  158.         var
  159.             len: longint;
  160.     begin
  161.         len := Min(255, GetHandleSize(hhhh));
  162.         s[0] := chr(len);
  163.         BlockMoveData(hhhh^, @s[1], len);
  164.     end;
  165. {$POP}
  166.  
  167.     function HandleToStr (hhhh: univ handle): Str255;
  168.         var
  169.             s: Str255;
  170.     begin
  171.         HandleToString(hhhh, s);
  172.         HandleToStr := s;
  173.     end;
  174.  
  175. {$PUSH}
  176. {$R-}
  177.     procedure StringToHandle (var s: Str255; hhhh: univ handle);
  178.     begin
  179.         SetHandleSize(hhhh, length(s));
  180.         BlockMoveData(@s[1], hhhh^, length(s));
  181.     end;
  182. {$POP}
  183.  
  184.     function Trim (s: string): string;
  185.     begin
  186.         while (length(s) > 0) and (s[1] in [spc, tab, cr, lf]) do begin
  187.             Delete(s, 1, 1);
  188.         end;
  189.         while (length(s) > 0) and (s[length(s)] in [spc, tab, cr, lf]) do begin
  190.             Delete(s, length(s), 1);
  191.         end;
  192.         Trim := s;
  193.     end;
  194.  
  195. {$IFC GENERATINGPOWERPC}
  196.     function UpCase (ch: char): char;
  197.     begin
  198.         if ('a' <= ch) & (ch <= 'z') then begin
  199.             ch := chr(ord(ch) - $20);
  200.         end;
  201.         UpCase := ch;
  202.     end;
  203.  
  204.     function IsDigit(ch:char):boolean;
  205.     begin
  206.         IsDigit:=('0'<=ch) & (ch<='9');
  207.     end;
  208.     
  209.     function IsLower(ch:char):boolean;
  210.     begin
  211.         IsLower:=('a'<=ch) & (ch<='z');
  212.     end;
  213.     
  214.     function IsUpper(ch:char):boolean;
  215.     begin
  216.         IsUpper:=('A'<=ch) & (ch<='Z');
  217.     end;
  218.     
  219.     function IsAlpha(ch:char):boolean;
  220.     begin
  221.         IsAlpha:=(('a'<=ch) & (ch<='z')) | (('A'<=ch) & (ch<='Z'));
  222.     end;
  223. {$ENDC}
  224.  
  225.     procedure UpCaseString (var s: string);
  226.         var
  227.             i: integer;
  228.     begin
  229.         for i := 1 to length(s) do begin
  230.             s[i] := UpCase(s[i]);
  231.         end;
  232.     end;
  233.  
  234.     function UpCaseStr (s: string): string;
  235.         var
  236.             i: integer;
  237.     begin
  238.         for i := 1 to length(s) do begin
  239.             s[i] := UpCase(s[i]);
  240.         end;
  241.         UpCaseStr := s;
  242.     end;
  243.  
  244.     procedure TPCopyString(var source,dest: string; destlen:integer);
  245.     begin
  246.         destlen := Min(destlen,length(source)+1);
  247.         BlockMoveData(@source,@dest,destlen);
  248.         dest[0] := chr(destlen-1);
  249.     end;
  250.     
  251.     function TPcopy (source: string; start, count: integer): string;
  252.     begin
  253.         if (start < 1) then begin
  254.             count := count - (1 - start);
  255.             start := 1;
  256.         end;
  257.         if start + count > length(source) then begin
  258.             count := length(source) - start + 1;
  259.         end;
  260.         if count < 0 then begin
  261.             count := 0;
  262.         end;
  263.         source[0] := chr(count);
  264.         BlockMoveData(@source[start], @source[1], count);
  265.         TPcopy := source;
  266.     end;
  267.  
  268.     function TPpos (sub, str: string): integer;
  269.         var
  270.             i, j, ret: integer;
  271.     begin
  272.         i := 1;
  273.         ret := 1;
  274.         if length(sub) > 0 then begin
  275.             ret := 0;
  276.             while (i <= length(str) - length(sub) + 1) do begin
  277.                 if str[i] = sub[1] then begin
  278.                     j:=2;
  279.                     while j<=length(sub) do begin
  280.                         if str[i+j-1]<>sub[j] then begin
  281.                             leave;
  282.                         end;
  283.                         j:=j+1;
  284.                     end;
  285.                     if j>length(sub) then begin
  286.                         ret:=i;
  287.                         leave;
  288.                     end;
  289.                 end;
  290.                 i := i + 1;
  291.             end;
  292.         end;
  293.         TPpos := ret;
  294.     end;
  295.  
  296.     procedure DoSub (var dst: Str255; n: integer; var s: Str255);
  297.         var
  298.             p: integer;
  299.     begin
  300.         p := TPpos(concat('^', chr(n + 48)), dst);
  301.         if p > 0 then begin
  302.             Delete(dst, p, 2);
  303.             Insert(s, dst, p);
  304.         end;
  305.     end;
  306.  
  307. {$Z+}
  308.     procedure SPrintS5V (var dst: Str255; var src, s1, s2, s3, s4, s5: Str255);
  309.     begin
  310.         dst := src;
  311.         DoSub(dst, 5, s5);
  312.         DoSub(dst, 4, s4);
  313.         DoSub(dst, 3, s3);
  314.         DoSub(dst, 2, s2);
  315.         DoSub(dst, 1, s1);
  316.     end;
  317. {$Z-}
  318.  
  319.     procedure SPrintS5 (var dst: Str255; src, s1, s2, s3, s4, s5: Str255);
  320.     begin
  321.         SPrintS5V(dst, src, s1, s2, s3, s4, s5);
  322.     end;
  323.  
  324.     procedure SPrintS3 (var dst: Str255; src, s1, s2, s3: Str255);
  325.     begin
  326.         dst := src;
  327.         DoSub(dst, 3, s3);
  328.         DoSub(dst, 2, s2);
  329.         DoSub(dst, 1, s1);
  330.     end;
  331.  
  332.     function PosRight (sub, s: Str255): integer;
  333.         var
  334.             p, q: integer;
  335.     begin
  336.         p := TPpos(sub, s);
  337.         if p > 0 then begin
  338.             q := length(s) - length(sub) + 1;
  339.             while q > p do begin
  340.                 if TPcopy(s, q, length(sub)) = sub then begin
  341.                     p := q;
  342.                 end else begin
  343.                     q := q - 1;
  344.                 end;
  345.             end;
  346.         end;
  347.         PosRight := p;
  348.     end;
  349.  
  350.     procedure SplitBy (s: Str255; ch: char; var left, right: Str255);
  351.         var
  352.             p: integer;
  353.     begin
  354.         p := TPpos(ch, s);
  355.         if p <= 0 then begin
  356.             left := s;
  357.             right := '';
  358.         end else begin
  359.             left := TPcopy(s, 1, p - 1);
  360.             right := TPcopy(s, p + 1, 255);
  361.         end;
  362.     end;
  363.  
  364.     procedure SplitRightBy (s: Str255; ch: char; var left, right: Str255);
  365.         var
  366.             p: integer;
  367.     begin
  368.         p := PosRight(ch, s);
  369.         if p <= 0 then begin
  370.             left := '';
  371.             right := s;
  372.         end else begin
  373.             left := TPcopy(s, 1, p - 1);
  374.             right := TPcopy(s, p + 1, 255);
  375.         end;
  376.     end;
  377.  
  378.     function Split (sub, s: Str255; var s1, s2: Str255): boolean;
  379.         var
  380.             p: integer;
  381.     begin
  382.         p := TPpos(sub, s);
  383.         if p > 0 then begin
  384.             s1 := TPcopy(s, 1, p - 1);
  385.             s2 := TPcopy(s, p + length(sub), 255);
  386.         end;
  387.         Split := p > 0;
  388.     end;
  389.  
  390.     function SplitRight (sub, s: Str255; var s1, s2: Str255): boolean;
  391.         var
  392.             p: integer;
  393.     begin
  394.         p := PosRight(sub, s);
  395.         if p > 0 then begin
  396.             s1 := TPcopy(s, 1, p - 1);
  397.             s2 := TPcopy(s, p + length(sub), 255);
  398.         end;
  399.         SplitRight := p > 0;
  400.     end;
  401.  
  402.     function Match (pattern, name: Str255): boolean;
  403.         function M (p, n: integer): boolean;
  404.             var
  405.                 state: (searching, failed, success);
  406.         begin
  407.             state := searching;
  408.             while state = searching do begin
  409.                 case ord(p <= length(pattern)) * 2 + ord(n <= length(name)) of
  410.                     0:  begin
  411.                         state := success;
  412.                     end;
  413.                     1:  begin
  414.                         state := failed;
  415.                     end;
  416.                     2:  begin
  417.                         state := success;
  418.                         while p <= length(pattern) do begin
  419.                             if pattern[p] <> '*' then begin
  420.                                 state := failed;
  421.                                 leave;
  422.                             end;
  423.                             p := p + 1;
  424.                         end;
  425.                     end;
  426.                     3:  begin
  427.                         case pattern[p] of
  428.                             '?':  begin
  429.                                 p := p + 1;
  430.                                 n := n + 1;
  431.                             end;
  432.                             '*':  begin
  433.                                 p := p + 1;
  434.                                 if p > length(pattern) then begin { short circuit the * at the end case }
  435.                                     state := success;
  436.                                 end else begin
  437.                                     state := failed;
  438.                                     while n <= length(name) do begin
  439.                                         if M(p, n) then begin
  440.                                             state := success;
  441.                                             leave;
  442.                                         end;
  443.                                         n := n + 1;
  444.                                     end;
  445.                                 end;
  446.                             end;
  447.                             otherwise begin
  448.                                 if name[n] <> pattern[p] then begin
  449.                                     state := failed;
  450.                                 end;
  451.                                 n := n + 1;
  452.                                 p := p + 1;
  453.                             end;
  454.                         end;
  455.                     end;
  456.                 end;
  457.             end;
  458.             M := state = success;
  459.         end;
  460.     begin
  461.         UpperString(pattern, false);
  462.         UpperString(name, false);
  463.         Match := M(1, 1);
  464.     end;
  465.  
  466.     procedure LimitStringLength (var s: string; len: integer; delimiter: char);
  467.         var
  468.             p: integer;
  469.     begin
  470.         if length(s) > len then begin
  471.             p := TPpos(delimiter, s);
  472.             if p <= 0 then begin
  473.                 p := length(s) div 2 + 1;
  474.                 s[p] := delimiter;
  475.             end;
  476.             while length(s) > len do begin
  477.                 if p > len div 2 + 1 then begin
  478.                     Delete(s, p - 1, 1);
  479.                     p := p - 1;
  480.                 end else begin
  481.                     Delete(s, p + 1, 1);
  482.                 end;
  483.             end;
  484.         end;
  485.     end;
  486.  
  487.     function StringToOSType (s: Str255): OSType;
  488.         var
  489.             t: OSType;
  490.     begin
  491.         s := concat(s, nul, nul, nul, nul);
  492.         BlockMoveData(@s[1], @t, 4);
  493.         StringToOSType := t;
  494.     end;
  495.  
  496.     function OSTypeToString (t: OSType): Str255;
  497.         var
  498.             s:Str255;
  499.     begin
  500.         s:=concat(nul,nul,nul,nul);
  501.         BlockMoveData(@t,@s[1],4);
  502.         OSTypeToString:=s;
  503.     end;
  504.  
  505. end.